package com.baizhiedu.injection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * ClassName: UserServiceImpl
 * Description:
 * Date: 2022/11/25 PM 2:21:37
 * <p>
 * project: spring5
 * package: com.baizhiedu.injection
 * email: 1085844536@qq.com
 * version:
 *
 * @author WangGuojian
 */
@Service
public class UserServiceImpl implements UserService {

    //@Autowired
    //@Qualifier("userDaoImpl")
    //@Resource(name = "userDaoImpl")
    @Resource
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    /**
     * /@Autowired 细节 [推荐]
     * 1.@Autowired 注解基于类型进行注入
     * 基于类型的注入：注入对象的类型，必须与目标成员变量类型相同或者是其子类(实现类)
     * <p>
     * 2.Autowired Qualifier 基于名字进行注入 [了解]
     * 基于名字的注入：注入对象的 id 值，必须与 Qualifier 注解中设置的名字相同
     * <p>
     * 3.Autowired 注解放置位置
     * a)放置在对应成员变量的 set 方法上
     * b)直接把这个注解防止在成员变量之上, Spring 通过反射直接对成员变量进行注入 (赋值) [推荐]
     * <p>
     * 4.JavaEE 规范中类似的功能的注解
     * JSR250 @Resource(name = "userDaoImpl") 基于名字进行注入
     * 相当于 @Autowired + Qualifier("userDaoImpl")
     * 注意：如果在应用 Resource 注解时，名字没有匹配成功，那么他会继续按照类型进行注入。
     * JSR330 @Inject 作用和 @Autowired 完全一致，基于类型进行注入
     *
     * @param userDao {@link UserDao}
     */
    //@Autowired
    //@Qualifier("userDaoImpl")
    public void setUserDao(UserDao userDao) {
        System.out.println("userServiceImpl.setUserDao");
        this.userDao = userDao;
    }

    @Override
    public void register() {
        userDao.save();
    }
}
